package com.dlyk.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.dlyk.model.User;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * jwt工具类，token工具类
 */
@Slf4j
public class JWTUtils {

    /**
     * 签名密钥
     */
    private static final String secret = "secret888";

    /**
     * 生成JWT
     */
    public static String createJWT(String userJson) {

        // 头部数据
        Map<String, Object> header = new HashMap<String, Object>();
        header.put("alg", "HS256");
        header.put("typ", "JWT");

        return JWT.create()
                .withHeader(header)                   // 头部
                .withClaim("user", userJson)    // 负载（自定义信息）
                .sign(Algorithm.HMAC256(secret));     // 使用HS256算法进行签名，使用secret作为密钥
    }

    /**
     * 校验JWT
     */
    public static boolean verifyJWT(String jwt) {

        try {
            // 创建校验器
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build();
            // 校验jwt
            DecodedJWT decodedJWT = jwtVerifier.verify(jwt);
            // 程序执行到这里，说明校验通过
            return true;
        } catch (Exception e) {
            log.error("token校验未通过");
            return false;
        }
    }

    /**
     * 从JWT的负载（payload）中获取用户信息
     */
    public static User parseUserFromJWT(String jwtToken) {

        try {
            // 创建校验器
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build();
            // 校验jwt，得到一个解码后的jwt对象
            DecodedJWT decodedJWT = jwtVerifier.verify(jwtToken);
            // 程序执行到这里，说明检验通过

            // 获取用户信息
            String userJson = decodedJWT.getClaim("user").asString();
            User user = JSONUtils.toBean(userJson, User.class);
            return user;
        } catch (Exception e) {
            log.error("用户信息获取失败");
            // 返回一个新的User对象，避免空指针
            return new User();
        }
    }

}

